import pandas as pd
import streamlit as st
from code import code_three

# 设置页面布局为宽屏模式
st.set_page_config(layout="wide")

# choice = st.sidebar.selectbox("请选择", ["前向传播", "反向传播", "代码示例及演示"])

st.title("PyTorch框架")
with st.form("form1"):
    st.markdown("## 一、 张量 ##")
    st.markdown("""
    ### 1、理解张量 ###
    #### 1.1 定义 ####
    在PyTorch中，张量（Tensor）是一个核心的数据结构，它类似于NumPy中的数组（ndarray），但张量能够在GPU上加速计算，并且与PyTorch的自动求导机制（autograd）紧密集成，使得深度学习模型的构建和训练变得更加高效和便捷。
    #### 1.2 张量的基本特性 ####
    1.多维性‌：张量可以是任意维度的，例如一维（向量），二维（矩阵），或者更高维度。  
    2.数据类型‌：张量有多种数据类型，如torch.float32, torch.int64, torch.bool等，用于存储不同类型的数据。  
    3.设备兼容性‌：张量可以在不同的设备上存储和计算，如CPU或GPU。通过.to(device)方法可以轻松地在设备之间移动张量。  
    4.自动求导‌：当设置requires_grad=True时，PyTorch会跟踪张量上的所有操作，以便自动计算梯度，这对于深度学习模型的训练至关重要。  
    总之：张量是pyTorch运算的基本单元，其中存储的是多维数据。  
    ### 2、张量的操作--代码示例 ###
    """)
    sample_code_one, sample_code_two = code_three.tensor_operations()
    with st.expander("点击展开查看代码"):
        st.code(sample_code_one, language="python")
        st.code(sample_code_two, language="python")
    st.markdown("""### 3、Tensor存储机制 ###""")
    st.write("连续内存存储: Tensor的值存储在连续的内存块中，通过torch.Storage类管理。")
    # 创建表格数据
    tensor_storage_data = {
        "特性": ["Storage对象", "数据指针", "共享存储"],
        "说明": ["管理底层一维连续内存", ".data_ptr()查看内存地址", "切片/转置操作共享存储，contiguous()后创建新存储"]
    }
    st.table(tensor_storage_data)
    st.markdown("""### 4、模型定义 ###""")
    st.markdown("#### 4.1 模型定义方法对比 ####")
    # 创建模型定义方法对比表格数据
    model_def_data = {
        "方法": ["nn.Module", "nn.Sequential", "ModuleList", "ModuleDict", "nn.Linear"],
        "特点": [
            "所有神经网络模块基类，需自定义__init__和forward方法",
            "容器类，按顺序执行模块",
            "动态模块列表（支持索引/迭代），自动注册子模块",
            "字典形式存储模块，通过键名访问",
            "是一个全连接层，接受输入张量并输出新张量"
        ],
        "使用场景": [
            "自定义复杂网络结构",
            "简单线性堆叠结构",
            "需要动态增减层的网络",
            "需要命名访问的复杂结构",
            "常用于神经网络的最后几层，将高维特征映射到输出类别或回归值。"
        ],
        "示例场景": [
            "多层感知机、自定义模块",
            "LeNet、AlexNet基础结构",
            "Transformer各层堆叠",
            "ResNet残差块管理",
            "线性回归或逻辑回归最后的映射"
        ]
    }
    st.table(model_def_data)
    st.markdown("""### 5、模型保存与加载 ###""")
    sample_code_one = code_three.model_save_load()
    with st.expander("点击展开查看示例代码"):
        st.code(sample_code_one, language="python")
    st.markdown("""### 6、pyTorch模型网络结构查看 ###""")
    sample_code_one = code_three.model_view()
    with st.expander("点击展开查看示例代码"):
        st.code(sample_code_one, language="python")
    col1, col2 = st.columns([10, 1])
    with col2:
        submit = st.form_submit_button("我已了解")
    if submit:
        st.success("恭喜你，你已完成本章知识点的学习")
        st.balloons()